/**  
 * @Title: RedisDao.java
 * @Package org.seckill.dao.cach
 * @Description: TODO(用一句话描述该文件做什么)
 * @author lxp  
 * @date 2016年9月26日 下午5:13:32
 * @version V1.0  
 */
package org.seckill.dao.cach;

import javax.management.loading.PrivateClassLoader;

import org.seckill.entity.Seckill;
import org.seckill.exception.SeckillCloseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.runtime.RuntimeSchema;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * @ClassName: RedisDao
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author ： lxp
 * @date ： 2016年9月26日 下午5:13:32
 *
 */
public class RedisDao {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private final JedisPool jedisPool;

    public RedisDao(String id, int port) {
        jedisPool = new JedisPool(id, port);
    }

    private RuntimeSchema<Seckill> schema = RuntimeSchema.createFrom(Seckill.class);

    public Seckill getSeckill(long seckillId) {

        // 缓存redis操作
        try {
            Jedis jedis = jedisPool.getResource();
            try {
                String key = "seckill:" + seckillId;
                // 并没有实现内部序列化操作
                // get->bytes[],反序列化 ->object[seckill]
                // 采用自定义的序列化的方式
                // protosstuff:pojo
                byte[] bytes = jedis.get(key.getBytes());
                // 缓存重获取到
                if (null != bytes) {
                    // 空对象
                    Seckill seckill = schema.newMessage();
                    ProtostuffIOUtil.mergeFrom(bytes, seckill, schema);
                    // seckill被反序列化
                    return seckill;
                }

            } finally {
                jedis.close();
            }

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }

        return null;
    }

    // 没有缓存 put一个
    public String putSeckill(Seckill seckill) {

        // set objec【seckill】->序列化->bytes[]
        try {
            Jedis jedis = jedisPool.getResource();
            try {
                String key = "seckill:" + seckill.getSeckillId();
                byte[] bytes = ProtostuffIOUtil.toByteArray(seckill, schema,
                        LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
                // 超时缓存
                int timeOut = 60 * 60;
                String result = jedis.setex(key.getBytes(), timeOut, bytes);
                return result;
            } finally {
                jedis.close();
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
        return null;
    }
}
